# Makefile de ejemplo para C++
#
# Creado: jue abr 15 15:34:19 ART 2004
#
# Copyleft 2004 - Leandro Lucarella, Bajo licencia GPL [http://www.gnu.org/]
#

# CONFIGURACION
################

# Nombre del ejecutable.
target = tpArbol

# Extensión de los archivos a compilar (c para C, cpp o cc o cxx para C++).
extension = cpp

# Archivos con el código fuente que componen el ejecutable. Si no se especifica,
# toma todos los archivos con la extensión mencionada. Para especificar hay que
# descomentar la línea (quitarle el '#' del principio).
# NOTA: No poner cabeceras (.h).
#fuentes = entrada.cpp

# Si usa funciones de math.h, descomentá (quitale el '#' a) la siguiente línea.
#math = si

# Si usa pthreads, descomentá (quitale el '#' a) la siguiente línea.
#pthreads = si

# Si usa gthreads, descomentá (quitale el '#' a) la siguiente línea.
#gthreads = si

# Si es un programa GTK+, descomentá (quitale el '#' a) la siguiente línea.
#gtk = si

# Si es un programa gtkmm, descomentá (quitale el '#' a) la siguiente línea.
#gtkmm = si

# Descomentar si se quiere ver como se invoca al compilador
#verbose = si


# CONFIGURACION "AVANZADA"
###########################

# Opciones para el compilador C/C++ en modo ansi.
CFLAGS = -Wall -Wextra -pedantic -pedantic-errors

# Para que explote lo mas posible
CFLAGS += -O0 -DNDEBUG

# Para valgrind o debug
CFLAGS += -ggdb -DDEBUG -fno-inline

# Opciones del enlazador.
#LDFLAGS =

# Estandar de C a usar
CSTD = c99

# Estandar de C++ a usar
CXXSTD = c++98

# Si se quiere compilar estaticamente, descomentar la siguiente linea
#static = si


# VARIABLES CALCULADAS A PARTIR DE LA CONFIGURACION
####################################################

# Agrego flags y libs de GTK+ de ser necesario.
ifdef gtk
CFLAGS += $(shell pkg-config --cflags gtk+-2.0)
LDFLAGS += $(shell pkg-config --libs gtk+-2.0)
endif

# Agrego flags y libs de GTK+ de ser necesario.
ifdef gtkmm
CFLAGS += $(shell pkg-config --cflags gtkmm-2.4)
LDFLAGS += $(shell pkg-config --libs gtkmm-2.4)
endif

# Agrego flags y libs de gthreads de ser necesario.
ifdef gthreads
CFLAGS += $(shell pkg-config --cflags gthread-2.0)
LDFLAGS += $(shell pkg-config --libs gthread-2.0)
endif

# Linkeo con libm de ser necesario.
ifdef math
LDFLAGS += -lm
endif

# Linkeo con pthreads de ser necesario.
ifdef pthreads
LDFLAGS += -lpthread -pthread
endif

ifdef static
LDFLAGS += -static
endif

# Pongo flags de C para C++ también
CXXFLAGS += $(CFLAGS)

# Uso enlazador de c++ si es código no C.
ifeq ($(extension), c)
CFLAGS += -std=$(CSTD)
LD = $(CC)
else
CXXFLAGS += -std=$(CXXSTD)
LD = $(CXX)
endif

# Si no especifica archivos, tomo todos.
fuentesArbol = $(wildcard Arbol/*.$(extension))

fuentesHash = $(wildcard Hash/*.$(extension))

fuentesCapaFisica = $(wildcard CapaFisica/*.$(extension)

fuentesPPMC = $(wildcard PPMC/*.$(extension)))

occ := $(CC)
ocxx := $(CXX)
orm := $(RM)
old := $(LD)
ifdef verbose
RM := $(RM) -v
else
CC =  @echo "  CC  $@"; $(occ)
CXX = @echo "  CXX $@"; $(ocxx)
RM =  @echo "  CLEAN"; $(orm)
LD =  @echo "  LD  $@"; $(old)
endif


# REGLAS
#########

.PHONY: all clean

all: $(target)

o_files_capafisica = $(patsubst CapaFisica/%.$(extension), objectos/CapaFisica/%.o, $(wildcard CapaFisica/*.$(extension)))

o_files_arbol = $(patsubst Arbol/%.$(extension), objectos/Arbol/%.o, $(wildcard Arbol/*.$(extension) ))

o_files_main = $(patsubst %.$(extension), objectos/%.o, $(wildcard *.$(extension)))

o_files_hash = $(patsubst Hash/%.$(extension), objectos/Hash/%.o, $(wildcard Hash/*.$(extension)))

o_files_ppmc = $(patsubst PPMC/%.$(extension), objectos/PPMC/%.o, $(wildcard PPMC/*.$(extension)))

objectos/CapaFisica/%.o: CapaFisica/%.$(extension)
	@echo 'Construyendo $<'
	@mkdir -p objectos
	@mkdir -p objectos/CapaFisica
	$(old) -c -MMD -MP $(CXXFLAGS) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
	@echo 'Finalizado $<'
	@echo ''

objectos/Arbol/%.o: Arbol/%.$(extension)
		
	@echo 'Construyendo $<'
	@mkdir -p objectos/Arbol
	$(old) -c -MMD -MP $(CXXFLAGS) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
	@echo 'Finalizado $<'
	@echo ''

objectos/Hash/%.o: Hash/%.$(extension)
	@echo 'Construyendo $<'
	@mkdir -p objectos/Hash
	$(old) -c -MMD -MP $(CXXFLAGS) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
	@echo 'Finalizado $<'
	@echo ''

objectos/PPMC/%.o: PPMC/%.$(extension)
	@echo 'Construyendo $<'
	@mkdir -p objectos/PPMC
	$(old) -c -MMD -MP $(CXXFLAGS) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
	@echo 'Finalizado $<'
	@echo ''

objectos/%.o: %.$(extension)
	@echo 'Construyendo $<'
	@mkdir -p objectos/PPMC
	$(old) -c -MMD -MP $(CXXFLAGS) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
	@echo 'Finalizado $<'
	@echo ''

$(target): $(o_files_capafisica) $(o_files_arbol) $(o_files_hash) $(o_files_ppmc) $(o_files_main)
	@if [ -z "$(o_files_capafisica)" ]; \
	then \
		echo "No hay archivos de entrada, recuerde que la extensión debe ser '.$(extension)'."; \
		false; \
	fi >&2
	@echo 'Construyendo ejecutable Arbol B+ (tpArbol)'
	$(LD) $(LDFLAGS) $(o_files_capafisica) $(o_files_arbol) objectos/mainArbol.o $(LOADLIBS) $(LDLIBS) -o tpArbol
	@echo 'Finalizado ejecutable tpArbol'
	@echo ' '
	@echo 'Construyendo ejecutable Hash (tpHash)'
	$(LD) $(LDFLAGS) $(o_files_capafisica) $(o_files_hash) objectos/mainHash.o $(LOADLIBS) $(LDLIBS) -o tpHash
	@echo 'Finalizado ejecutable tpHash'
	
	$(LD) $(LDFLAGS) $(o_files_capafisica) $(o_files_arbol) $(o_files_ppmc) objectos/mainPPMC.o $(LOADLIBS) $(LDLIBS) -o tpPPMC
	@echo 'Finalizado ejecutable tpPPMC'

clean:
	$(RM) $(o_files_arbol) $(o_files_capafisica) $(o_files_arbol:.o=.d) $(o_files_capafisica:.o=.d) $(o_files_hash) $(o_files_hash:.o=.d) $(o_files_ppmc) $(o_files_ppmc:.o=.d) $(o_files_main) $(o_files_main:.o=.d) tpHash tpArbol tpPPMC

cleanP:
	$(RM) $(o_files_ppmc) $(o_files_ppmc:.o=.d) tpPPMC objectos/mainPPMC.o objectos/mainPPMC.d
